#ifndef TROJAN_WRITER_H
#define TROJAN_WRITER_H

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <jni.h>
#include <string>
#include <vector>
#include <fstream>
#include "ErrorInfo.h"
#include "LyLogPrint.h"

//一次性分配的页数
#define ALLOC_PAGE_NUM 4

class LogWriter {
public:
    LogWriter();
    ~LogWriter();
    ErrorInfo *init(JNIEnv *,   std::string logDir );
    ErrorInfo *writeLog(JNIEnv *, const char *logMsg );
    // 日志文件的保存路径
    std::string filePath;

private:
    // fstat 获取文件状态，成功返回0，失败返回－1
    struct stat fileStat;
    // 文件描述符 ，根据描述符可以进一步对文件进行操作
    int fd;
    // 日志文件大小
    off_t fileSize;
    // 开辟的内存页面的总大小
    off_t logPageSize;
    char *recordPtr = NULL;
    off_t recordIndex = 0;

    ErrorInfo *initMmap(std::string logDir);

    /**
     * 获得当前日期，格式类似2017-11-06
     */
    static std::string getDate();

    static ErrorInfo *checkMmapFile(LogWriter* mWriter);
    /**
     * msync + munmap
     */
    static ErrorInfo *syncDataAndUnMmapFile(  void *map, size_t map_size);

};

#endif //TROJAN_WRITER_H
